#ifndef EDITORPLUGIN_H
#define EDITORPLUGIN_H


#include <QtPlugin>
#include <QtWidgets/QtWidgets>


class EditorWindow;
class Packer;
class Unpacker;


class EditorPlugin
{
public:
    virtual ~EditorPlugin() {}

    /**
     * @brief 获取插件名称
     * @return 返回插件名称
     */
    virtual QString name() const = 0;

    /**
     * @brief 获取插件ID
     * @return 返回插件ID
     */
    virtual uint pluginID() const = 0;

    /**
     * @brief 创建工程时调用
     * @param projPath : 工程路径
     * @param parent : 工程QTreeWidget节点
     * @return 调用成功返回true，否则返回false
     */
    virtual bool onCreateProject(const QString &projPath) = 0;

    /**
     * @brief 打开工程时调用
     * @param projPath : 工程路径
     * @param parent : 工程QTreeWidget节点
     * @return 调用成功返回true，否则返回false
     */
    virtual bool onOpenProject(const QString &projPath, QTreeWidgetItem *parent) = 0;

    /**
     * @brief 关闭工程时调用
     * @return 调用成功返回true，否则返回false
     */
    virtual bool onCloseProject() = 0;

    /**
     * @brief 创建文件
     * @param name : 文件名
     * @return 调用成功返回true，否则返回false
     */
    virtual int onCreateFile(const QString &name) = 0;

    /**
     * @brief 打开文件
     * @param name : 文件名
     * @param parent : 父窗口对象
     * @param exists : 窗口是否已经创建
     * @return 返回创建的编辑器窗口对象
     */
    virtual EditorWindow *onOpenFile(const QString &name, QWidget *parent, int userType, bool &exists) = 0;

    /**
     * @brief 关闭文件
     * @return 调用成功返回true，否则返回false
     */
    virtual bool onCloseFile() = 0;

    /**
     * @brief 刷新文件树
     */
    virtual void onRefresh() = 0;

    /**
     * @brief 获取编辑器的图标
     * @return 返回编辑器图标对象
     */
    virtual QIcon *icon() = 0;

    /**
     * @brief 获取编辑器对应文件扩展名
     * @return 返回编辑器对应文件扩展名
     */
    virtual QString fileExtension() const = 0;

    /**
     * @brief 获取创建文件的路径
     * @return 返回文件存放路径
     */
    virtual QString fileFolder() const = 0;

    /**
     * @brief 导出数据时候调用
     * @param packer : 打包对象，由打包插件返回该对象
     * @return 打包成功返回true，否则返回false
     */
    virtual bool onExport(Packer *packer) = 0;

    /**
     * @brief 导入数据时候调用
     * @param unpacker : 解包对象，由打包插件返回该对象
     * @return 解包成功返回true，否则返回false
     */
    virtual bool onImport(Unpacker *unpacker) = 0;
};

#define EDITOR_PLUGIN_IID        "RocStudio.GameEditor.EditorPlugin"

Q_DECLARE_INTERFACE(EditorPlugin, EDITOR_PLUGIN_IID)

#endif // EDITORPLUGIN_H
